home *** CD-ROM | disk | FTP | other *** search
/ Delphi Informant Complete 1995 - 2000 / Delphi Informant Complete 1995 to 2000.iso / Delphi Informant Magazine Complete Works SOURCE CODE 1995.rar / 1995 / JUL / JO9507 / track.pas < prev   
Pascal/Delphi Source File  |  1995-05-26  |  15KB  |  512 lines

  1. unit Track;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, ExtCtrls, DBCtrls, StdCtrls, Mask, Buttons, Grids,
  8.   DBGrids, DB, DBTables;
  9.  
  10. const
  11.    DbStates : array[dsInactive..dsCalcFields] of string[12] =
  12.                 ('dsInactive', 'dsBrowse', 'dsEdit', 'dsInsert',
  13.                  'dsSetKey', 'dsCalcFields');
  14.  
  15. type
  16.   TFrmDBTrack = class(TForm)
  17.     dsMaster: TDataSource;
  18.     tblMaster: TTable;
  19.     dsDetail: TDataSource;
  20.     DBGrid1: TDBGrid;
  21.     DBEdit1: TDBEdit;
  22.     DBEdit2: TDBEdit;
  23.     DBNavigator2: TDBNavigator;
  24.     lstEvent: TListBox;
  25.     btnClear: TBitBtn;
  26.     tblDetail: TTable;
  27.     DBEdit4: TDBEdit;
  28.     Label1: TLabel;
  29.     DBNavigator1: TDBNavigator;
  30.     edCount: TEdit;
  31.     cboTables: TComboBox;
  32.     Label2: TLabel;
  33.     GroupBox1: TGroupBox;
  34.     btnInsert: TBitBtn;
  35.     btnDelete: TBitBtn;
  36.     btnEdit: TBitBtn;
  37.     btnPost: TBitBtn;
  38.     btnCancel: TBitBtn;
  39.     btnOpen: TBitBtn;
  40.     btnClose: TBitBtn;
  41.     dlgSaveAs: TSaveDialog;
  42.     btnSaveList: TBitBtn;
  43.     tblMasterCustNo: TFloatField;
  44.     tblMasterCompany: TStringField;
  45.     tblMasterMyCalcField: TIntegerField;
  46.     Label3: TLabel;
  47.     Label4: TLabel;
  48.     procedure btnInsertClick(Sender: TObject);
  49.     procedure btnDeleteClick(Sender: TObject);
  50.     procedure btnEditClick(Sender: TObject);
  51.     procedure btnPostClick(Sender: TObject);
  52.     procedure btnCancelClick(Sender: TObject);
  53.     procedure btnClearClick(Sender: TObject);
  54.  
  55.     procedure TrackDataChange(Sender: TObject; Field: TField);
  56.     procedure TrackStateChange(Sender: TObject);
  57.     procedure TrackUpdateData(Sender: TObject);
  58.     procedure FormCreate(Sender: TObject);
  59.     procedure TrackAfterCancel(DataSet: TDataset);
  60.     procedure TrackAfterClose(DataSet: TDataset);
  61.     procedure TrackAfterDelete(DataSet: TDataset);
  62.     procedure TrackAfterEdit(DataSet: TDataset);
  63.     procedure TrackAfterInsert(DataSet: TDataset);
  64.     procedure TrackAfterOpen(DataSet: TDataset);
  65.     procedure TrackAfterPost(DataSet: TDataset);
  66.     procedure TrackBeforeCancel(DataSet: TDataset);
  67.     procedure TrackBeforeClose(DataSet: TDataset);
  68.     procedure TrackBeforeDelete(DataSet: TDataset);
  69.     procedure TrackBeforeEdit(DataSet: TDataset);
  70.     procedure TrackBeforeInsert(DataSet: TDataset);
  71.     procedure TrackBeforeOpen(DataSet: TDataset);
  72.     procedure TrackBeforePost(DataSet: TDataset);
  73.     procedure TrackOnCalc(DataSet: TDataset);
  74.     procedure TrackNewRec(DataSet: TDataset);
  75.     procedure btnOpenClick(Sender: TObject);
  76.     procedure btnCloseClick(Sender: TObject);
  77.     procedure cboTablesChange(Sender: TObject);
  78.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  79.     procedure SaveEventList(Sender: TObject);
  80.  
  81.   private
  82.     ListLen: Word;
  83.     IndentLevel: Byte;
  84.     CurrentTable: TTable;
  85.     CurrentSource: TDataSource;
  86.     procedure LogEvent(EventStr: string);
  87.     procedure ToggleButtons(StateParam: TDataSetState);
  88.     { Private declarations }
  89.   public
  90.     { Public declarations }
  91.   end;
  92.  
  93. var
  94.   FrmDBTrack: TFrmDBTrack;
  95.  
  96. implementation
  97.  
  98. {$R *.DFM}
  99.  
  100. procedure TFrmDBTrack.ToggleButtons(StateParam: TDataSetState);
  101. var ButtonEnabled: Boolean;
  102.  
  103. begin
  104.      {
  105.       If the table is in edit or insert mode then disable the Insert
  106.       Delete and Edit buttons else disable the Post and Cancel buttons.
  107.  
  108.       If the table is closed/inactive then disable all pushbuttons.
  109.      }
  110.  
  111.      ButtonEnabled := not(StateParam in [dsEdit, dsInsert, dsInactive]);
  112.  
  113.      btnInsert.Enabled := ButtonEnabled;
  114.      btnDelete.Enabled := ButtonEnabled;
  115.      btnEdit.Enabled   := ButtonEnabled;
  116.  
  117.      if StateParam = dsInactive then
  118.      begin
  119.           btnPost.Enabled   := False;
  120.           btnCancel.Enabled := False;
  121.      end
  122.      else
  123.      begin
  124.           btnPost.Enabled   := not ButtonEnabled;
  125.           btnCancel.Enabled := not ButtonEnabled;
  126.      end;
  127.  
  128.      ButtonEnabled    := (CurrentTable <> nil);
  129.      btnOpen.Enabled  := ButtonEnabled;
  130.      btnClose.Enabled := ButtonEnabled;
  131. end;
  132.  
  133. procedure TFrmDBTrack.LogEvent(EventStr: string);
  134. var IndentStr: string[32];
  135.     i        : byte;
  136.  
  137. begin
  138.      with lstEvent do
  139.      begin
  140.           IndentStr := '';
  141.  
  142.           if IndentLevel > 0 then
  143.           begin
  144.              for i := 1 to IndentLevel do
  145.                  IndentStr := IndentStr + '  ';
  146.  
  147.              Items.Add(IndentStr + EventStr);
  148.           end
  149.           else
  150.              Items.Add(EventStr);
  151.  
  152.           Inc(ListLen);
  153.           edCount.Text := IntToStr(ListLen);
  154.           ItemIndex := Items.Count - 1;
  155.      end;
  156.  
  157.      btnSaveList.Enabled := (ListLen > 0);
  158. end;
  159.  
  160. procedure TFrmDBTrack.TrackDataChange(Sender: TObject; Field: TField);
  161. var ds: TDataSource;
  162.  
  163. begin
  164.      ds := Sender as TDataSource;
  165.  
  166.      if (Field = nil) then
  167.         { event was triggered by more than one field therefore
  168.           this event resulted from moving to another record }
  169.         LogEvent('OnDataChange for ' + ds.Name)
  170.      else
  171.      if ds.State in [dsEdit, dsInsert] then
  172.         { event was triggered by a single field therefore
  173.           this event resulted from a single field value being
  174.           changed during editing }
  175.         LogEvent('OnDataChange for ' + ds.Name + '.' + Field.FieldName)
  176.      else
  177.         { event occurred for single field whilst not in Edit/Insert }
  178.         LogEvent('OnDataChange for ' + ds.Name)
  179. end;
  180.  
  181. procedure TFrmDBTrack.TrackStateChange(Sender: TObject);
  182. var
  183.    MySender: TDataSource;
  184.  
  185. begin
  186.      MySender := Sender as TDataSource;
  187.  
  188.      LogEvent('OnStateChange to ' +
  189.               DbStates[MySender.State] +
  190.               ' for ' + MySender.Name);
  191.  
  192.      { don't want to try getting the name of an undefined dataset }
  193.      if MySender.DataSet <> nil then
  194.         LogEvent('Table state change to ' +
  195.                  DbStates[TTable(MySender.DataSet).State] +
  196.                  ' for ' + TTable(MySender.DataSet).Name)
  197.      else
  198.         LogEvent('WARNING -- no dataset defined for ' + MySender.Name);
  199.  
  200.      ToggleButtons(MySender.State)
  201. end;
  202.  
  203. procedure TFrmDBTrack.TrackUpdateData(Sender: TObject);
  204. begin
  205.      with (Sender as TDataSource) do
  206.           LogEvent('OnUpdateData for ' + Name);
  207. end;
  208.  
  209. procedure TFrmDBTrack.btnInsertClick(Sender: TObject);
  210. begin
  211.      LogEvent('Begin TTable.Insert');
  212.      Inc(IndentLevel);
  213.  
  214.      CurrentTable.Insert;
  215.  
  216.      Dec(IndentLevel);
  217.      LogEvent('End TTable.Insert');
  218. end;
  219.  
  220. procedure TFrmDBTrack.btnDeleteClick(Sender: TObject);
  221. begin
  222.      LogEvent('Begin TTable.Delete');
  223.      Inc(IndentLevel);
  224.  
  225.      CurrentTable.Delete;
  226.  
  227.      Dec(IndentLevel);
  228.      LogEvent('End TTable.Delete');
  229. end;
  230.  
  231. procedure TFrmDBTrack.btnEditClick(Sender: TObject);
  232. begin
  233.      LogEvent('Begin TTable.Edit');
  234.      Inc(IndentLevel);
  235.  
  236.      CurrentTable.Edit;
  237.  
  238.      Dec(IndentLevel);
  239.      LogEvent('End TTable.Edit');
  240. end;
  241.  
  242. procedure TFrmDBTrack.btnPostClick(Sender: TObject);
  243. begin
  244.      LogEvent('Begin TTable.Post');
  245.      Inc(IndentLevel);
  246.  
  247.      CurrentTable.Post;
  248.  
  249.      Dec(IndentLevel);
  250.      LogEvent('End TTable.Post');
  251. end;
  252.  
  253. procedure TFrmDBTrack.btnCancelClick(Sender: TObject);
  254. begin
  255.      LogEvent('Begin TTable.Cancel');
  256.      Inc(IndentLevel);
  257.  
  258.      CurrentTable.Cancel;
  259.  
  260.      Dec(IndentLevel);
  261.      LogEvent('End TTable.Cancel');
  262. end;
  263.  
  264. procedure TFrmDBTrack.FormCreate(Sender: TObject);
  265. var i: word;
  266.  
  267. begin
  268.      { find all TDataSource objects on the form and add them to
  269.        the TStrings list associated with the TCombobox object }
  270.  
  271.      with cboTables do
  272.      begin
  273.           for i := 0 to Self.ComponentCount - 1 do
  274.               if (Self.Components[i] is TDataSource) then
  275.                  { add the name and a pointer to the object to the list }
  276.                  Items.AddObject(TDataSource(Self.Components[i]).Name,
  277.                                  TDataSource(Self.Components[i]));
  278.  
  279.               { the form's main pushbuttons will call TTable methods for
  280.                 CurrentTable which defaults to the dataset of the first
  281.                 TDataSource object